package Beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import outils.Outils;
import personne.Personne;
import recompenses.Recompense;
import recompenses.RecompenserFilm;
import recompenses.RecompenserPersonne;
import DAOJPA.DAOFilmJPA;
import DAOJPA.DAONoterFilmJPA;
import DAOJPA.DAOParticiperJPA;
import DAOJPA.DAOPersonneJPA;
import DAOJPA.DAORecompenseJPA;
import DAOJPA.DAORecompenserFilmJPA;
import DAOJPA.DAORecompenserPersonneJPA;
import DAOJPA.DAOUtilisateurJPA;
import film.Film;
import film.Participer;
import gestionnaire.NoterFilm;
import gestionnaire.Utilisateur;

@ManagedBean
@RequestScoped
public class BeansFilm implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	
	private Film film = new Film();
	private int personne ;
	private String role;
	private int code ; 
	private int vote;
	private boolean valide;
	private Date date;


		
	public List<Film> getFilms()
	{
		if(Outils.getSession().getAttribute("username") == null )
		{
			this.valide = true;
		}
		else
		{
			this.valide = false;
		}

		
		return DAOFilmJPA.getInstance().loadAll();
	}
	

	public Film getFilmCode(){
	
		return DAOFilmJPA.getInstance().getFilm(this.code);
	}
	
	
	public List<Participer> getPersonnes()
	{
		return DAOParticiperJPA.getInstance().getPersonnes(this.film.getCode_film());
	}
	
	
	public List<RecompenserFilm> getRecompences()
	{
		
		List<RecompenserFilm> l = (new ArrayList<RecompenserFilm>(this.film.getRecompense()));
		List<RecompenserFilm> l2 = new ArrayList<RecompenserFilm>();
		for (int i = 0 ; i < l.size() ; i++)
		{
			if(  l.get(i).getValide() == 0) l2.add(l.get(i));			
		}
		return l;
		
		
	}
	
	
	private List<Participer> getListPersonnes(String role)
	{
		List<Participer> l = new ArrayList<Participer>();
		for (int i = 0 ; i < this.getPersonnes().size() ; i++)
		{
			if(  this.getPersonnes().get(i).getRole().contains(role)) l.add(this.getPersonnes().get(i));			
		}
		return l;
	}
	
	
	public List<Personne> getProducteur()
	{
		List<Participer> l = this.getListPersonnes("Producteur");	
		return this.participerToPersonne(l);
	}
	
	
	public List<Personne> getActeur()
	{
		List<Participer> l = this.getListPersonnes("Acteur");	
		return this.participerToPersonne(l);
	}
	
	
	public List<Personne> getRealisateur ()
	{
		List<Participer> l = this.getListPersonnes("Realisateur");	
		return this.participerToPersonne(l);
		
	}
	
	
	public void Voter()
	{

		List<Utilisateur> util = DAOUtilisateurJPA.getInstance().getUtilisateur(Outils.getSession().getAttribute("username").toString());

		List<NoterFilm> personne = new ArrayList<NoterFilm> (this.film.getUtilisateur());
		int size = personne.size();
		for (int i = 0 ; i < size ; i++)
		{
			if (personne.get(i).getUtilisateur().getCode_per() == util.get(0).getCode_per()) 
			{
				System.out.println(personne.get(i).getUtilisateur().getCode_per());
				System.out.println(util.get(0).getCode_per());
				DAONoterFilmJPA.getInstance().delete(DAONoterFilmJPA.getManager().merge(personne.get(i)));
				
			}
		}
		
		NoterFilm noter = new NoterFilm(util.get(0),this.film , this.vote);
		
		DAONoterFilmJPA.getInstance().save(noter);

		 FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Merci !",  null);
	     FacesContext.getCurrentInstance().addMessage(null, message);

	}
	
	
	public void ajouterParticipation() 
	{
		Personne f = DAOPersonneJPA.getInstance().getPersonne(this.personne);
		Participer p = new Participer(f, this.film, this.role);
		DAOParticiperJPA.getInstance().save(p);

	}
	
	
	public List<Film> getFilmInvalide()
	{
		List<Film> l =  DAOFilmJPA.getInstance().loadAllFilmInvalide();	
		return l;
	}
	
	
	public void validerFilm()
	{
		Film f = new Film(this.film.getCode_film(), this.film.getTitre(), this.film.getAnnee_sortie() ,this.film.getLien_photo(),this.film.getGenre(), this.film.getCout(), this.film.getDate_creation());
		DAOFilmJPA.getInstance().deleteFromId(this.film.getCode_film());
		DAOFilmJPA.getInstance().delete(this.film);
		DAOFilmJPA.getInstance().save(f);
	}

	
	public void supprimerFilm()
	{
		DAOFilmJPA.getInstance().deleteFilmQuery(this.film);
	}
	
		
	public void noteMoyenne()
	{
		List<NoterFilm> n = new ArrayList<NoterFilm>( this.film.getUtilisateur());
		if (n.size() != 0)
		{
			int somme = 0 ;
			for (int i = 0 ; i < n.size() ; i++)
			{
				somme = somme + n.get(i).getNote();
			}
		
		this.vote = somme/n.size();
		}
		else this.vote = 0;
	}
	
	public void ajouterRecompense()
	{
		Recompense f = DAORecompenseJPA.getInstance().getRecompense(this.code);
		DAORecompenserFilmJPA.getInstance().save(new RecompenserFilm(f , this.film , this.date , this.role));
	}
	
	
	/*** outils ***/
	public List<Personne> participerToPersonne(List<Participer> l)
	{
		List<Personne> f = new ArrayList<Personne>();
		for (int i = 0 ; i < l.size() ; i++)
		{
			f.add(DAOPersonneJPA.getInstance().getPersonne(l.get(i).getId().getCode_per()));
		}
		return f;
	}
	
	
	public int getCode() {
		return code;
	}

	
	public void setCode(int code) {
		this.code = code;
	}

	
	public Film getFilm() {
		return film;
	}

	
	public void setFilm(Film film) {
		this.film = film;
	}


	public int getVote() {
		return vote;
	}


	public void setVote(int vote) {
		this.vote = vote;
	}



	public boolean isValide() {
		return valide;
	}


	public void setValide(boolean valide) {
		this.valide = valide;
	}


	public int getPersonne() {
		return personne;
	}


	public void setPersonne(int personne) {
		this.personne = personne;
	}


	public String getRole() {
		return role;
	}


	public void setRole(String role) {
		this.role = role;
	}


	public Date getDate() {
		return date;
	}


	public void setDate(Date date) {
		this.date = date;
	}



		
	
}
